package lila.common

// children friendly names only
// this is used by /class
object CuteNameGenerator {

  type CuteName = String

  def make(maxSize: Int = 20, triesLeft: Int = 100): Option[CuteName] = {
    val name = makeForSure
    if (name.sizeIs <= maxSize) name.some
    else if (triesLeft <= 0) none
    else make(maxSize, triesLeft - 1)
  }

  def makeForSure: CuteName = anyOf(combinations).map(anyOf).mkString

  def fromSeed(seed: Int): CuteName = seedOf(seed)(combinations).map(seedOf(seed)).mkString

  private def anyOf[A](vec: Vector[A]): A =
    vec(lila.common.ThreadLocalRandom.nextInt(vec.size))

  private def seedOf[A](seed: Int)(vec: Vector[A]): A =
    vec(Math.abs(seed) % vec.size)

  lazy val combinations: Vector[List[Vector[String]]] = Vector(
    List(colors ++ adjectives, animals ++ pieces ++ jobs),
    List(colors, adjectives, animals ++ pieces ++ jobs),
    List(colors ++ adjectives, adjectives, animals ++ pieces ++ jobs),
    List(colors ++ adjectives, jobs, animals ++ pieces)
  )

  def colors =
    Vector(
      "Amber",
      "Aqua",
      "Azure",
      "Beige",
      "Black",
      "Blue",
      "Brass",
      "Brown",
      "Burgundy",
      "Cerulean",
      "Cherry",
      "Chestnut",
      "Cobalt",
      "Copper",
      "Crimson",
      "Cyan",
      "Emberald",
      "Fuschia",
      "Gold",
      "Gray",
      "Green",
      "Indigo",
      "Lilac",
      "Lime",
      "Magenta",
      "Maroon",
      "Mint",
      "Moss",
      "Navy",
      "Olive",
      "Orange",
      "Pink",
      "Platinum",
      "Plum",
      "Purple",
      "Red",
      "Rose",
      "Ruby",
      "Saffron",
      "Sapphire",
      "Silver",
      "Steel",
      "Tan",
      "Tangerine",
      "Teal",
      "Tomato",
      "Turquoise",
      "Violet",
      "White",
      "Yellow"
    )

  def pieces =
    Vector(
      "Bishop",
      "King",
      "Knight",
      "Pawn",
      "Queen",
      "Rook"
    )

  def animals =
    Vector(
      "Aardvark",
      "Alligator",
      "Alpaca",
      "Ant",
      "Antelope",
      "Anteater",
      "Ape",
      "Armadillo",
      "Baboon",
      "Badger",
      "Bat",
      "Bear",
      "Bee",
      "Beetle",
      "Bison",
      "Buffalo",
      "Butterfly",
      "Camel",
      "Carabao",
      "Cariboo",
      "Cat",
      "Centaur",
      "Cheetah",
      "Chicken",
      "Chimpanzee",
      "Chinchilla",
      "Cicada",
      "Clam",
      "Cod",
      "Coyote",
      "Crab",
      "Cricket",
      "Crocodile",
      "Crow",
      "Deer",
      "Dinosaur",
      "Dog",
      "Dolphin",
      "Dragon",
      "Duck",
      "Eagle",
      "Echidna",
      "Eel",
      "Elephant",
      "Elf",
      "Elk",
      "Falcon",
      "Ferret",
      "Finch",
      "Fish",
      "Fly",
      "Fox",
      "Frog",
      "Gerbil",
      "Giraffe",
      "Gnat",
      "Gnu",
      "Goat",
      "Goblin",
      "Goldfish",
      "Goose",
      "Gorilla",
      "Grasshopper",
      "Grebe",
      "Griffin",
      "Grouse",
      "Guinea",
      "Hamster",
      "Hare",
      "Hawk",
      "Hedgehog",
      "Herring",
      "Heron",
      "Hippopotamus",
      "Hornet",
      "Horse",
      "Hound",
      "Hyena",
      "Impala",
      "Insect",
      "Jackal",
      "Jellyfish",
      "Kangaroo",
      "Kingfisher",
      "Kiwi",
      "Koala",
      "Lark",
      "Leopard",
      "Lion",
      "Lizard",
      "Llama",
      "Locust",
      "Louse",
      "Macaw",
      "Mallard",
      "Mammoth",
      "Manatee",
      "Marten",
      "Mink",
      "Minnow",
      "Minotaur",
      "Mole",
      "Monkey",
      "Moose",
      "Mosquito",
      "Mouse",
      "Mule",
      "Muskrat",
      "Octopus",
      "Otter",
      "Owl",
      "Ox",
      "Oyster",
      "Panda",
      "Parrot",
      "Penguin",
      "Pig",
      "Platypus",
      "Pony",
      "Porcupine",
      "Prairie",
      "Pug",
      "Rabbit",
      "Raccoon",
      "Raven",
      "Reindeer",
      "Rhinoceros",
      "Salmon",
      "Sardine",
      "Scorpion",
      "Seal",
      "Serval",
      "Shark",
      "Sheep",
      "Snail",
      "Snake",
      "Sphinx",
      "Spider",
      "Squirrel",
      "Swan",
      "Termite",
      "Tiger",
      "Triceratops",
      "Troll",
      "Trout",
      "Turtle",
      "Unicorn",
      "Walrus",
      "Wasp",
      "Weasel",
      "Werewolf",
      "Whale",
      "Wolf",
      "Wombat",
      "Woodchuck",
      "Worm",
      "Wren",
      "Yak",
      "Yellowjacket",
      "Zebra"
    )

  def adjectives =
    Vector(
      "Abiding",
      "Able",
      "Absolute",
      "Absolved",
      "Abundant",
      "Academic",
      "Accepted",
      "Accurate",
      "Active",
      "Acute",
      "Adamant",
      "Adept",
      "Adequate",
      "Adjusted",
      "Admired",
      "Adonic",
      "Adorable",
      "Adored",
      "Adroit",
      "Advanced",
      "Affable",
      "Affined",
      "Affluent",
      "Ageless",
      "Agile",
      "Alert",
      "Alive",
      "Allied",
      "Alluring",
      "Alright",
      "Amative",
      "Amatory",
      "Amazing",
      "Amenable",
      "Amiable",
      "Amicable",
      "Amusing",
      "Angelic",
      "Aplenty",
      "Appetent",
      "Apposite",
      "Apropos",
      "Apt",
      "Ardent",
      "Artistic",
      "Aspirant",
      "Aspiring",
      "Assured",
      "Assuring",
      "Astir",
      "Astute",
      "Athletic",
      "Atypical",
      "August",
      "Avid",
      "Awaited",
      "Awake",
      "Aware",
      "Awash",
      "Awesome",
      "Balanced",
      "Baronial",
      "Beaming",
      "Beatific",
      "Becoming",
      "Beefy",
      "Beloved",
      "Benefic",
      "Benign",
      "Best",
      "Better",
      "Big",
      "Biggest",
      "Bijou",
      "Blazing",
      "Blessed",
      "Blissful",
      "Blithe",
      "Blooming",
      "Bold",
      "Bonny",
      "Bonzer",
      "Boss",
      "Bound",
      "Brainy",
      "Brave",
      "Brawny",
      "Breezy",
      "Brief",
      "Bright",
      "Brill",
      "Brimming",
      "Brisk",
      "Bubbly",
      "Budding",
      "Buff",
      "Bullish",
      "Buoyant",
      "Bustling",
      "Busy",
      "Calm",
      "Calming",
      "Canny",
      "Canty",
      "Capable",
      "Capital",
      "Carefree",
      "Careful",
      "Caring",
      "Casual",
      "Centered",
      "Central",
      "Cerebral",
      "Certain",
      "Champion",
      "Charming",
      "Cheerful",
      "Cherry",
      "Chic",
      "Chipper",
      "Chirpy",
      "Choice",
      "Chosen",
      "Chummy",
      "Civic",
      "Civil",
      "Classic",
      "Classy",
      "Clean",
      "Clear",
      "Clement",
      "Clever",
      "Close",
      "Clubby",
      "Coequal",
      "Cogent",
      "Coherent",
      "Colossal",
      "Coltish",
      "Comic",
      "Comical",
      "Complete",
      "Composed",
      "Concise",
      "Concrete",
      "Constant",
      "Content",
      "Cool",
      "Coolest",
      "Copious",
      "Cordial",
      "Correct",
      "Cosmic",
      "Cosy",
      "Courtly",
      "Cozy",
      "Creative",
      "Credible",
      "Crisp",
      "Crucial",
      "Cuddly",
      "Cultured",
      "Cunning",
      "Curious",
      "Current",
      "Cushy",
      "Cute",
      "Dainty",
      "Dandy",
      "Dapper",
      "Daring",
      "Darling",
      "Dashing",
      "Dazzling",
      "Dear",
      "Debonair",
      "Decent",
      "Deciding",
      "Decisive",
      "Decorous",
      "Deep",
      "Defiant",
      "Definite",
      "Deft",
      "Delicate",
      "Deluxe",
      "Designer",
      "Desired",
      "Desirous",
      "Destined",
      "Devoted",
      "Devout",
      "Didactic",
      "Diligent",
      "Dinkum",
      "Direct",
      "Discreet",
      "Discrete",
      "Distinct",
      "Diverse",
      "Divine",
      "Doable",
      "Dominant",
      "Doting",
      "Doughty",
      "Dreamy",
      "Driven",
      "Driving",
      "Durable",
      "Dutiful",
      "Dynamic",
      "Dynamite",
      "Eager",
      "Early",
      "Earnest",
      "Earthly",
      "Earthy",
      "Easy",
      "Eclectic",
      "Economic",
      "Ecstatic",
      "Edified",
      "Educated",
      "Elated",
      "Elating",
      "Elder",
      "Electric",
      "Elegant",
      "Eligible",
      "Eloquent",
      "Emerging",
      "Eminent",
      "Enamored",
      "Enduring",
      "Engaging",
      "Enhanced",
      "Enormous",
      "Enough",
      "Enticing",
      "Equable",
      "Equal",
      "Equipped",
      "Erudite",
      "Especial",
      "Esteemed",
      "Esthetic",
      "Eternal",
      "Ethical",
      "Euphoric",
      "Eventful",
      "Evident",
      "Exact",
      "Exalted",
      "Exotic",
      "Exultant",
      "Fab",
      "Fabulous",
      "Facile",
      "Factual",
      "Fain",
      "Fair",
      "Faithful",
      "Famed",
      "Familial",
      "Familiar",
      "Family",
      "Famous",
      "Fancy",
      "Fast",
      "Favored",
      "Favorite",
      "Fearless",
      "Feasible",
      "Fervent",
      "Festal",
      "Festive",
      "Fiery",
      "Fine",
      "Finer",
      "Finest",
      "Firm",
      "First",
      "Fit",
      "Fitting",
      "Flash",
      "Flashy",
      "Flawless",
      "Fleet",
      "Fluent",
      "Flying",
      "Focused",
      "Fond",
      "Forceful",
      "Foremost",
      "Forward",
      "Fragrant",
      "Frank",
      "Free",
      "Freely",
      "Fresh",
      "Friendly",
      "Fruitful",
      "Full",
      "Fun",
      "Funny",
      "Gainful",
      "Gallant",
      "Galore",
      "Game",
      "Gamesome",
      "Generous",
      "Genial",
      "Genteel",
      "Gentle",
      "Genuine",
      "Germane",
      "Gettable",
      "Giddy",
      "Gifted",
      "Giving",
      "Glad",
      "Gleaming",
      "Gleeful",
      "Glorious",
      "Glowing",
      "Gnarly",
      "Godly",
      "Golden",
      "Good",
      "Goodly",
      "Gorgeous",
      "Graced",
      "Graceful",
      "Gracile",
      "Gracious",
      "Gradely",
      "Graithly",
      "Grand",
      "Grateful",
      "Great",
      "Greatest",
      "Groovy",
      "Grounded",
      "Growing",
      "Grown",
      "Guided",
      "Guiding",
      "Gutsy",
      "Halcyon",
      "Hale",
      "Hallowed",
      "Handsome",
      "Handy",
      "Happy",
      "Hardy",
      "Harmless",
      "Head",
      "Healing",
      "Healthy",
      "Hearty",
      "Heavenly",
      "Heedful",
      "Helpful",
      "Hep",
      "Heralded",
      "Heroic",
      "High",
      "Highest",
      "Hip",
      "Holy",
      "Homely",
      "Honest",
      "Honeyed",
      "Honorary",
      "Honored",
      "Hopeful",
      "Hotshot",
      "Huggy",
      "Humane",
      "Humble",
      "Humorous",
      "Hygienic",
      "Hypnotic",
      "Ideal",
      "Idolized",
      "Imitable",
      "Immense",
      "Immortal",
      "Immune",
      "Impish",
      "Improved",
      "Incisive",
      "Included",
      "Inerrant",
      "Infant",
      "Infinite",
      "Informed",
      "Initiate",
      "Innocent",
      "Inspired",
      "Integral",
      "Intense",
      "Intent",
      "Internal",
      "Intimate",
      "Intrepid",
      "Inviting",
      "Jaunty",
      "Jazzed",
      "Jazzy",
      "Jestful",
      "Jesting",
      "Jewelled",
      "Jiggish",
      "Jigjog",
      "Jocose",
      "Jocular",
      "Jocund",
      "Joint",
      "Jointed",
      "Jolly",
      "Jovial",
      "Joyful",
      "Joyous",
      "Joysome",
      "Jubilant",
      "Jump",
      "Just",
      "Keen",
      "Kempt",
      "Key",
      "Kind",
      "Kindly",
      "Kindred",
      "Kinetic",
      "Kingly",
      "Knightly",
      "Knowable",
      "Knowing",
      "Kooky",
      "Kosher",
      "Large",
      "Lasting",
      "Laudable",
      "Laureate",
      "Lavish",
      "Lawful",
      "Leading",
      "Learned",
      "Legal",
      "Legible",
      "Legit",
      "Leisured",
      "Leonine",
      "Lepid",
      "Lettered",
      "Liberal",
      "Lightly",
      "Likable",
      "Like",
      "Liked",
      "Likely",
      "Limber",
      "Literary",
      "Literate",
      "Lithe",
      "Live",
      "Lively",
      "Logical",
      "Lordly",
      "Lovable",
      "Loved",
      "Lovely",
      "Loving",
      "Loyal",
      "Lucent",
      "Lucid",
      "Lucky",
      "Luminous",
      "Luscious",
      "Lush",
      "Lustrous",
      "Magical",
      "Magnetic",
      "Main",
      "Majestic",
      "Major",
      "Manifest",
      "Manly",
      "Mannerly",
      "Many",
      "Marked",
      "Master",
      "Masterly",
      "Maternal",
      "Mature",
      "Maturing",
      "Maximal",
      "Mediate",
      "Meek",
      "Mellow",
      "Merciful",
      "Merry",
      "Meteoric",
      "Mighty",
      "Mindful",
      "Minikin",
      "Mint",
      "Mirthful",
      "Model",
      "Modern",
      "Modest",
      "Moneyed",
      "Moral",
      "More",
      "Most",
      "Motor",
      "Moving",
      "Much",
      "Mucho",
      "Muscular",
      "Musical",
      "Must",
      "Mutual",
      "National",
      "Native",
      "Natty",
      "Natural",
      "Nearby",
      "Neat",
      "Needed",
      "Neoteric",
      "Nestling",
      "New",
      "Newborn",
      "Nice",
      "Nifty",
      "Nimble",
      "Nippy",
      "Noble",
      "Noetic",
      "Normal",
      "Notable",
      "Noted",
      "Novel",
      "Now",
      "Official",
      "Olympian",
      "Once",
      "One",
      "Onward",
      "Open",
      "Optimal",
      "Optimum",
      "Opulent",
      "Orderly",
      "Organic",
      "Oriented",
      "Original",
      "Outgoing",
      "Overt",
      "Pally",
      "Palpable",
      "Parental",
      "Partisan",
      "Paternal",
      "Patient",
      "Peaceful",
      "Peachy",
      "Peerless",
      "Peppy",
      "Perfect",
      "Perky",
      "Pet",
      "Petite",
      "Picked",
      "Pierian",
      "Pilot",
      "Pious",
      "Piquant",
      "Pithy",
      "Pivotal",
      "Placid",
      "Playful",
      "Pleasant",
      "Pleased",
      "Pleasing",
      "Plenary",
      "Plenty",
      "Plucky",
      "Plummy",
      "Plus",
      "Plush",
      "Poetic",
      "Pog",
      "Poignant",
      "Poised",
      "Polished",
      "Polite",
      "Popular",
      "Posh",
      "Positive",
      "Possible",
      "Potent",
      "Powerful",
      "Precious",
      "Precise",
      "Premier",
      "Premium",
      "Prepared",
      "Present",
      "Pretty",
      "Primal",
      "Primary",
      "Prime",
      "Primed",
      "Primo",
      "Princely",
      "Pristine",
      "Prize",
      "Prized",
      "Pro",
      "Probable",
      "Profound",
      "Profuse",
      "Prolific",
      "Prompt",
      "Proper",
      "Protean",
      "Proud",
      "Prudent",
      "Puissant",
      "Pukka",
      "Punchy",
      "Punctual",
      "Pure",
      "Quaint",
      "Quality",
      "Queenly",
      "Quick",
      "Quiet",
      "Quirky",
      "Quiver",
      "Quixotic",
      "Quotable",
      "Rad",
      "Radiant",
      "Rapid",
      "Rational",
      "Ready",
      "Real",
      "Refined",
      "Regal",
      "Regnant",
      "Regular",
      "Relaxed",
      "Relevant",
      "Reliable",
      "Relieved",
      "Renowned",
      "Resolute",
      "Resolved",
      "Restful",
      "Revered",
      "Reverent",
      "Rich",
      "Right",
      "Rightful",
      "Risible",
      "Robust",
      "Romantic",
      "Rooted",
      "Rosy",
      "Round",
      "Rounded",
      "Rousing",
      "Rugged",
      "Ruling",
      "Running",
      "Sacred",
      "Safe",
      "Sage",
      "Saintly",
      "Salient",
      "Salutary",
      "Sanguine",
      "Sapid",
      "Sapient",
      "Saucy",
      "Saving",
      "Savory",
      "Savvy",
      "Scenic",
      "Seamless",
      "Seasonal",
      "Seasoned",
      "Secure",
      "Sedulous",
      "Seemly",
      "Select",
      "Selfless",
      "Sensible",
      "Serene",
      "Service",
      "Set",
      "Settled",
      "Sharp",
      "Sheen",
      "Shining",
      "Shiny",
      "Showy",
      "Shrewd",
      "Sightly",
      "Silken",
      "Silky",
      "Silver",
      "Silvery",
      "Simple",
      "Sincere",
      "Sinewy",
      "Singular",
      "Sisterly",
      "Sizable",
      "Sizzling",
      "Skilled",
      "Skillful",
      "Sleek",
      "Slick",
      "Slinky",
      "Smacking",
      "Smart",
      "Smashing",
      "Smiley",
      "Smooth",
      "Snap",
      "Snappy",
      "Snazzy",
      "Snod",
      "Snug",
      "Soaring",
      "Sociable",
      "Social",
      "Societal",
      "Soft",
      "Soigne",
      "Solid",
      "Sonsy",
      "Sooth",
      "Soothing",
      "Soulful",
      "Sound",
      "Spacious",
      "Spangly",
      "Sparkly",
      "Special",
      "Specular",
      "Speedy",
      "Spicy",
      "Spiffy",
      "Spirited",
      "Splendid",
      "Sport",
      "Sporting",
      "Sportive",
      "Sporty",
      "Spot",
      "Spotless",
      "Spruce",
      "Spry",
      "Spunky",
      "Square",
      "Stable",
      "Stacked",
      "Stalwart",
      "Staminal",
      "Standard",
      "Standing",
      "Star",
      "Starry",
      "State",
      "Stately",
      "Staunch",
      "Steady",
      "Stellar",
      "Sterling",
      "Sthenic",
      "Stirred",
      "Stirring",
      "Stocky",
      "Stoical",
      "Storied",
      "Stout",
      "Striking",
      "Strong",
      "Studious",
      "Stunning",
      "Sturdy",
      "Stylish",
      "Suasive",
      "Suave",
      "Sublime",
      "Substant",
      "Subtle",
      "Succinct",
      "Sugary",
      "Suitable",
      "Sultry",
      "Summery",
      "Sunny",
      "Super",
      "Superb",
      "Superior",
      "Supernal",
      "Supple",
      "Supreme",
      "Sure",
      "Svelte",
      "Swank",
      "Sweet",
      "Swell",
      "Swift",
      "Swish",
      "Sylvan",
      "Tactful",
      "Talented",
      "Tangible",
      "Tasteful",
      "Tasty",
      "Teeming",
      "Tempean",
      "Tenable",
      "Terrific",
      "Thankful",
      "Thorough",
      "Thrilled",
      "Thriving",
      "Tidy",
      "Timeless",
      "Timely",
      "Tiptop",
      "Tireless",
      "Titanic",
      "Today",
      "Together",
      "Tolerant",
      "Top",
      "Tops",
      "Total",
      "Touching",
      "Tough",
      "Tranquil",
      "Traveled",
      "Tretis",
      "Trim",
      "True",
      "Trustful",
      "Trusting",
      "Trusty",
      "Truthful",
      "Tubular",
      "Tuneful",
      "Tympanic",
      "Uber",
      "Ultimate",
      "Ultra",
      "Unafraid",
      "Unbeaten",
      "Unbiased",
      "Unbroken",
      "Uncommon",
      "Unerring",
      "Unharmed",
      "Unhurt",
      "Unified",
      "Unique",
      "United",
      "Unshaken",
      "Unspoilt",
      "Untiring",
      "Unusual",
      "Upbeat",
      "Upcoming",
      "Uplifted",
      "Upright",
      "Upward",
      "Upwardly",
      "Urbane",
      "Usable",
      "Useful",
      "Utmost",
      "Valiant",
      "Valid",
      "Valorous",
      "Valuable",
      "Valued",
      "Vast",
      "Vaulting",
      "Vehement",
      "Venust",
      "Verified",
      "Versed",
      "Very",
      "Vestal",
      "Veteran",
      "Viable",
      "Vibrant",
      "Victor",
      "Vigilant",
      "Vigorous",
      "Virtuous",
      "Vital",
      "Vivid",
      "Vocal",
      "Volant",
      "Wanted",
      "Warm",
      "Wealthy",
      "Weighty",
      "Welcome",
      "Welcomed",
      "Well",
      "Welsome",
      "Whole",
      "Whopping",
      "Willed",
      "Willing",
      "Winged",
      "Winning",
      "Winsome",
      "Wired",
      "Wise",
      "Witty",
      "Wizard",
      "Wizardly",
      "Won",
      "Wondrous",
      "Workable",
      "Worldly",
      "Worth",
      "Worthy",
      "Xenial",
      "Yern",
      "Young",
      "Youthful",
      "Zaftig",
      "Zany",
      "Zappy",
      "Zazzy",
      "Zealed",
      "Zealful",
      "Zealous",
      "Zestful",
      "Zesty",
      "Zingy",
      "Zippy",
      "Zooty"
    )

  def jobs =
    Vector(
      "Actor",
      "Architect",
      "Artist",
      "Astronaut",
      "Astronomer",
      "Author",
      "Baker",
      "Banjoist",
      "Barber",
      "Bassist",
      "Beekeeper",
      "Blacksmith",
      "Botanist",
      "Builder",
      "Chef",
      "Chemist",
      "Choreographer",
      "Coder",
      "Dancer",
      "Dentist",
      "Diver",
      "Doctor",
      "Drummer",
      "Duelist",
      "Fan",
      "Farmer",
      "Florist",
      "Flutist",
      "Gardener",
      "Geologist",
      "Guide",
      "Guitarist",
      "Harpist",
      "Journalist",
      "Judge",
      "Lawyer",
      "Musician",
      "Ninja",
      "Nurse",
      "Officer",
      "Optician",
      "Pianist",
      "Player",
      "Runner",
      "Singer",
      "Trumpeter",
      "Ukulelist",
      "Vet",
      "Violist",
      "Wizard",
      "Writer"
    )
}
